﻿//namespace FFF.Test.Application.AppServices.PublicService.Grid
//{
//    using System;
//    using System.Collections.Generic;
//    using System.Data;
//    using System.IdentityModel.Tokens.Jwt;
//    using System.IO;
//    using System.Linq;
//    using System.Reflection;
//    using System.Security.Claims;
//    using System.Text;
//    using System.Text.RegularExpressions;
//    using System.Threading.Tasks;
//    using Abp.Application.Services;
//    using Abp.Application.Services.Dto;
//    using Abp.Auditing;
//    using Abp.Domain.Uow;
//    using Abp.EntityFrameworkCore;
//    using Abp.Runtime.Security;
//    using Abp.UI;
//    using Abp.Web.Models;
//    using Abp.Linq.Dynamic.Extensions;
//    using AutoMapper.Configuration;
//    using Microsoft.AspNetCore.Authentication.JwtBearer;
//    using Microsoft.AspNetCore.Authorization;
//    using Microsoft.AspNetCore.Mvc;
//    using Microsoft.EntityFrameworkCore;
//    using Microsoft.Extensions.Configuration;
//    using Microsoft.IdentityModel.Tokens;
//    using Newtonsoft.Json;
//    using Newtonsoft.Json.Serialization;
//    using FFF.Test.DataAccess.Framework;
//    using FFF.Test.DataAccess.Framework.Configuration;
//    using FFF.Test.Entity.Demo;
//    using FFF.Test.Entity.Demo.View;
//    using FFF.Test.Util.Configuration;
//    using FFF.Test.Util.Consts;
//    using FFF.Test.Util.Web;
//    using Ydm.Extensions;
//    using Ydm.Helper;
//    using Z.Expressions;
//    using Microsoft.AspNetCore.Http;

//    /// <summary>
//    /// session的使用
//    /// </summary>
//    public interface IDataGridAppService : IApplicationService
//    {
//        /// <summary>
//        /// 获取Gird的数据
//        /// </summary>
//        /// <param name="inDto">表格接收参数</param>
//        /// <returns>grid</returns>
//        Task<string> GetGridList([FromForm]GetGridListInDto inDto);

//        /// <summary>
//        /// Exprot Grid数据
//        /// </summary>
//        /// <param name="inDto">导出传入对象</param>
//        /// <returns>excel文件</returns>
//        Task<FileContentResult> GetGridExcel(GetGridListInDto inDto);

//        /// <summary>
//        /// 导入数据
//        /// </summary>
//        /// <param name="inDto">导入对象</param>
//        /// <returns>提示信息</returns>
//        Task<ImportOutDto> ImportExcel(ImportInDto inDto);
//    }

//    /// <summary>
//    /// Token的管理对象
//    /// </summary>
//    [YdmApiVersionAttribute(Version = "My")]
//    public class DataGridAppService : YdmAbpAppServiceBase, IDataGridAppService
//    {
//        private readonly IDbContextProvider<MyDbContext> _dbContextProvider;
//        private readonly IHttpContextAccessor _httpContext;

//        /// <summary>
//        /// Initializes a new instance of the <see cref="DataGridAppService"/> class.
//        /// toke构造方法初始化配置对象
//        /// </summary>
//        /// <param name="dbContextProvider">dbContextProvider</param>
//        /// <param name="httpContext">httpContext</param>
//        public DataGridAppService(
//            IDbContextProvider<MyDbContext> dbContextProvider,
//            IHttpContextAccessor httpContext)
//        {
//            this._dbContextProvider = dbContextProvider;
//            this._httpContext = httpContext;
//        }

//        /// <summary>
//        /// 获取Gird的数据
//        /// </summary>
//        /// <param name="inDto">表格接收参数</param>
//        /// <returns>grid</returns>
//        [HttpPost]
//        [WrapResult(WrapOnSuccess = false, WrapOnError = false)]
//        [Authorize(Roles = "admin")]
//        [UnitOfWork(isTransactional: false)]
//        public async Task<string> GetGridList(GetGridListInDto inDto)
//        {
//            var result = await this.GetGridDataResult(inDto);

//            GridResult gridResult = new GridResult()
//            {
//                Rows = result.DataList,
//                Total = result.RowCount
//            };

//            JsonSerializerSettings settings = new JsonSerializerSettings
//            {
//                ReferenceLoopHandling = ReferenceLoopHandling.Error, //忽略循环引用，如果设置为Error，则遇到循环引用的时候报错（建议设置为Error，这样更规范）
//                DateFormatString = "yyyy-MM-dd HH:mm:ss", //日期格式化，默认的格式也不好看
//                ContractResolver = new CamelCasePropertyNamesContractResolver() //json中属性开头字母小写的驼峰命名
//            };
//            return JsonConvert.SerializeObject(gridResult, settings);
//        }

//        /// <summary>
//        /// ExprotGrid数据
//        /// </summary>
//        /// <param name="inDto">导出传入对象</param>
//        /// <returns>excel文件</returns>
//        [HttpGet]
//        [WrapResult(WrapOnSuccess = false, WrapOnError = false)]
//        [UnitOfWork(isTransactional: false)]
//        public async Task<FileContentResult> GetGridExcel(GetGridListInDto inDto)
//        {
//            var result = await this.GetGridDataResult(inDto);
//            inDto.ColName = Regex.Replace(inDto.ColName, @"\(.*?\)", string.Empty);
//            List<string> colNames = inDto.ColName.Split(",").ToList();
//            List<string> fieldNames = inDto.FieldName.Split(",").ToList();

//            Func<string, string> reName = x =>
//            {
//                int index = fieldNames.FindIndex(y => y.ToLower() == x.ToLower());
//                if (index != -1)
//                {
//                    if (index <= colNames.Count - 1)
//                    {
//                        return colNames[index];
//                    }
//                    else
//                    {
//                        return null;
//                    }
//                }
//                else
//                {
//                    return null;
//                }
//            };
//            byte[] stream = YdmExcelHelper.GetExcelForList(result.DataList, reName);

//            FileContentResult returnFile = new FileContentResult(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//            returnFile.FileDownloadName = $"{inDto.ExcelTitle}.xlsx";
//            return returnFile;
//        }

//        /// <summary>
//        /// 导入数据
//        /// </summary>
//        /// <param name="inDto">导入对象</param>
//        /// <returns>提示信息</returns>
//        public async Task<ImportOutDto> ImportExcel(ImportInDto inDto)
//        {
//            if (inDto.FilePath.IsNullOrEmpty())
//            {
//                throw new UserFriendlyException("未找到文件");
//            }

//            // 读取Excel文件
//            string filePath = Server.MapPath($@"~{inDto.FilePath}");

//            // 构造列的dic
//            Dictionary<string, string> dicColMapper = new Dictionary<string, string>();
//            inDto.ColName = Regex.Replace(inDto.ColName, @"\(.*?\)", string.Empty);
//            List<string> colNames = inDto.ColName.Split(",").ToList();
//            List<string> fieldNames = inDto.FieldName.Split(",").ToList();
//            for (int i = 0; i < colNames.Count; i++)
//            {
//                dicColMapper.Add(colNames[i], fieldNames[i].ToCamel());
//            }

//            // 读取table表格转lst
//            DataTable dt = YdmExcelHelper.ExcelToDataTable(filePath);
//            string tableName = inDto.TableName.ToCamel();
//            string viewName = ("View_" + tableName).ToCamel();
//            string viewFullName = ViewConfiguration.ViewFullNames.FirstOrDefault(x => x.Split(",")[0].EndsWith(viewName));
//            string entityFullName = ViewConfiguration.EntityFullNames.FirstOrDefault(x => x.Split(",")[0].EndsWith(tableName + "Entity"));
//            Type enityType = Type.GetType(entityFullName);
//            Type viewType = Type.GetType(viewFullName);

//            Assembly assemblyYdmEx = Assembly.Load("Ydm.Extensions");
//            MethodInfo pageMethodinfo = assemblyYdmEx.GetExtensionMethods("ToList").FirstOrDefault();
//            dynamic lst = pageMethodinfo.MakeGenericMethod(viewType)
//                .Invoke(null, new object[] { dt, dicColMapper, true });

//            MethodInfo map = this.ObjectMapper.GetType().GetMethod("Map", new Type[] { typeof(object) });
//            MethodInfo methodNew = map.MakeGenericMethod(typeof(List<>).MakeGenericType(enityType));
//            dynamic entitys = methodNew.Invoke(this.ObjectMapper, new object[] { lst });

//            MyDbContext db = this._dbContextProvider.GetDbContext();
//            await db.AddRangeAsync(entitys);

//            ImportOutDto dto = new ImportOutDto()
//            {
//                StatusCode = 200,
//                Title = "提示信息",
//                Message = "导入成功"
//            };

//            return dto;
//        }

//        private async Task<dynamic> GetGridDataResult(GetGridListInDto inDto)
//        {
//            // 获取tablename
//            string tablename = inDto.ViewName.ToLower().Replace("view_", string.Empty);
//            if (!this._httpContext.HttpContext.Session.GetUserInfo().IsHaveRights(tablename, "00"))
//            {
//                throw new UserFriendlyException("您没有对应的查询权限");
//            }

//            string viewName = inDto.ViewName.ToCamel();

//            if (!string.IsNullOrEmpty(inDto.Sort))
//            {
//                inDto.Order = inDto.Sort + " " + inDto.Order;
//            }

//            if (!string.IsNullOrEmpty(inDto.Select))
//            {
//                inDto.Select = $"new({inDto.Select})";
//            }

//            if (inDto.Select.IsNullOrEmpty())
//            {
//                inDto.Select = $"new({inDto.FieldName})";
//            }

//            PagedInputDto pagedInputDto = new PagedInputDto()
//            {
//                PageSize = inDto.Rows.ToDefault(99999),
//                PageIndex = inDto.Page.ToDefault(1),
//                Order = inDto.Order,
//                Select = inDto.Select
//            };

//            if (!string.IsNullOrEmpty(inDto.Filter))
//            {
//                pagedInputDto.Filter = JsonConvert.DeserializeObject<PageFilterDto>(inDto.Filter);
//            }

//            MyDbContext db = this._dbContextProvider.GetDbContext();
//            PropertyInfo prop = db.GetType().GetProperty(viewName);
//            object propVaule = prop.GetValue(db, null);
//            Assembly autoAssembly = Assembly.Load("Ydm.Abp.EntityFrameworkCore");

//            if (ViewConfiguration.ViewFullNames.Count == 0)
//            {
//                var s = await db.ViewDemoStudent.FirstOrDefaultAsync();
//            }

//            string viewFullName = ViewConfiguration.ViewFullNames.FirstOrDefault(x => x.Split(",")[0].EndsWith(viewName));
//            Type viewType = Type.GetType(viewFullName);

//            if (!inDto.FilterRules.IsNullOrEmpty() && inDto.FilterRules != "[]")
//            {
//                // 有过滤条件那么要加上
//                if (pagedInputDto.Filter == null)
//                {
//                    pagedInputDto.Filter = new PageFilterDto()
//                    {
//                        Type = "and",
//                        InnerType = "and",
//                        Conditions = new List<Condition>()
//                    };
//                }

//                List<JuiFilterDto> filterRules = JsonConvert.DeserializeObject<List<JuiFilterDto>>(inDto.FilterRules);

//                // 把JUi的filter构造我们的filter
//                foreach (var filterRule in filterRules)
//                {
//                    if (!filterRule.Field.IsNullOrEmpty() && !filterRule.Value.IsNullOrEmpty())
//                    {
//                        var fieldType = viewType.GetProperty(filterRule.Field.ToCamel()).PropertyType;
//                        Condition condition = new Condition()
//                        {
//                            Attribute = filterRule.Field,
//                            Value = filterRule.Value,
//                            Datatype = fieldType.GetDbType().ToString()
//                        };

//                        // 枚举的话那么需要 用等于，其他的不是字符串也都要用等于进行初始化
//                        if (filterRule.Op.ToLower() == "contains" && ((condition.Datatype.ToLower() != "varchar" && condition.Datatype.ToLower() != "nvarchar") || fieldType.IsEnum))
//                        {
//                            condition.Operatoer = AppConfigConsts.JuiOps["equal"];
//                        }
//                        else
//                        {
//                            condition.Operatoer = AppConfigConsts.JuiOps[filterRule.Op];
//                        }

//                        pagedInputDto.Filter.Conditions.Add(condition);
//                    }

//                }
//            }

//            if (!inDto.AdvanceFilter.IsNullOrEmpty() && inDto.AdvanceFilter != "[]")
//            {
//                List<JUIAdvanceFilterDto> filters = JsonConvert.DeserializeObject<List<JUIAdvanceFilterDto>>(inDto.AdvanceFilter);

//                string where = string.Empty;
//                List<object> pars = new List<object>();
//                for (int i = 0; i < filters.Count; i++)
//                {
//                    string join = filters[i].Join;
//                    if (i == 0)
//                    {
//                        join = string.Empty;
//                    }

//                    where += string.Format(" " + join + " " + filters[i].Lb + filters[i].Field + AppConfigConsts.JuiAdvanceOps[filters[i].Op] + filters[i].Rb + " ", "@" + i);
//                    var fieldType = viewType.GetProperty(filters[i].Field.ToCamel()).PropertyType;
//                    object paramValue = filters[i].Value.ToObjectValue(fieldType.ToString());
//                    pars.Add(paramValue);
//                }

//                propVaule = ((IQueryable<object>)propVaule).Where(where, pars.ToArray());
//            }

//            MethodInfo pageMethodinfo = autoAssembly.GetExtensionMethods("GetPageAsync").FirstOrDefault();

//            dynamic result = await pageMethodinfo.MakeGenericMethod(viewType, typeof(object))
//                .InvokeAsync(null, new object[] { propVaule, pagedInputDto });

//            return result;
//        }
//    }
//}